package com.example.docmanagement.repository;

import com.example.docmanagement.entity.FileMetadata;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * 文件元数据 Repository
 * 提供文件元数据的数据访问功能
 */
@Repository
public interface FileMetadataRepository extends JpaRepository<FileMetadata, Long>, 
                                                 JpaSpecificationExecutor<FileMetadata> {

    /**
     * 根据文件路径查找文件（未删除）
     * 
     * @param filePath MinIO 文件路径
     * @return 文件元数据
     */
    Optional<FileMetadata> findByFilePathAndDeletedAtIsNull(String filePath);

    /**
     * 根据 MD5 哈希查找文件（用于去重）
     * 
     * @param md5Hash MD5 哈希值
     * @return 文件元数据列表
     */
    List<FileMetadata> findByMd5HashAndDeletedAtIsNull(String md5Hash);

    /**
     * 查询文档关联的所有文件（未删除）
     * 
     * @param documentId 文档 ID
     * @return 文件列表
     */
    List<FileMetadata> findByDocumentIdAndDeletedAtIsNull(Long documentId);

    /**
     * 查询文档特定类型的文件（未删除）
     * 
     * @param documentId 文档 ID
     * @param fileType   文件类型
     * @return 文件列表
     */
    List<FileMetadata> findByDocumentIdAndFileTypeAndDeletedAtIsNull(Long documentId, String fileType);

    /**
     * 查询用户上传的所有文件（未删除）
     * 
     * @param uploadedBy 上传者 ID
     * @param pageable   分页参数
     * @return 文件分页数据
     */
    Page<FileMetadata> findByUploadedByAndDeletedAtIsNull(UUID uploadedBy, Pageable pageable);

    /**
     * 查询特定类型的所有文件（未删除）
     * 
     * @param fileType 文件类型
     * @param pageable 分页参数
     * @return 文件分页数据
     */
    Page<FileMetadata> findByFileTypeAndDeletedAtIsNull(String fileType, Pageable pageable);

    /**
     * 查询特定 Bucket 的所有文件（未删除）
     * 
     * @param bucketName Bucket 名称
     * @param pageable   分页参数
     * @return 文件分页数据
     */
    Page<FileMetadata> findByBucketNameAndDeletedAtIsNull(String bucketName, Pageable pageable);

    /**
     * 查询未关联文档的文件（临时上传）
     * 
     * @param pageable 分页参数
     * @return 文件分页数据
     */
    Page<FileMetadata> findByDocumentIdIsNullAndDeletedAtIsNull(Pageable pageable);

    /**
     * 统计文档的文件数量
     * 
     * @param documentId 文档 ID
     * @return 文件数量
     */
    @Query("SELECT COUNT(f) FROM FileMetadata f WHERE f.documentId = :documentId AND f.deletedAt IS NULL")
    long countByDocumentId(@Param("documentId") Long documentId);

    /**
     * 统计特定类型的文件总大小
     * 
     * @param fileType 文件类型
     * @return 总大小（字节）
     */
    @Query("SELECT COALESCE(SUM(f.fileSize), 0) FROM FileMetadata f WHERE f.fileType = :fileType AND f.deletedAt IS NULL")
    long sumFileSizeByFileType(@Param("fileType") String fileType);

    /**
     * 统计用户上传的文件总大小
     * 
     * @param uploadedBy 上传者 ID
     * @return 总大小（字节）
     */
    @Query("SELECT COALESCE(SUM(f.fileSize), 0) FROM FileMetadata f WHERE f.uploadedBy = :uploadedBy AND f.deletedAt IS NULL")
    long sumFileSizeByUploadedBy(@Param("uploadedBy") UUID uploadedBy);
}

